package com.heima.activiti;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
/**
 * 部署流程定义：
 * 		将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中
 * Deployment:
 * 		原文：A deployment is a container for resources such as process definitions, images, forms, etc.
 * 		翻译：部署是流程定义、图像、表单等资源的容器。
 * ProcessDefinition
 * 		原文：An object structure representing an executable process composed of activities and transitions.ProcessDefinition
 * 		翻译：一种对象结构，表示由活动和转换组成的可执行过程
 * 总结：ProcessDefinition依赖于Deployment，如果没有Deployment，也就没有ProcessDefinition
 * 涉及表结构：
 * 		act_re_deployment 	部署信息
 * 		act_re_procdef 		流程定义的一些信息
 * 		act_ge_bytearray 	流程定义bpmn文件和png文件
 */
/**
 * @Auth: zhuan
 * @Desc: Activiti第一步：流程部署
 * @Date: 2022-03-25 15:59:25
 */
@SpringBootTest(classes = SpringbootActivity7Application.class)
@RunWith(SpringRunner.class)
public class ActivitiDeploymentTest001 {
		/**
		 * RepositoryService:
		 * 	是Activiti的资源管理接口，提供了管理和控制流程发布包和流程定义的操作。
		 * 	使用工作流建模工具设计的业务流程图需要使用此Service将流程定义文件的内容部署到计算机中
		 */
		@Autowired
		private RepositoryService repositoryService;

		/**
		 * 功能描述: 通过bpmn、png部署流程
		 * @return : void
		 */
		@Test
		public void initDeploymentBPMN(){
				String filename= "diagram/请假申请流程.bpmn";
				String pngname="diagram/请假申请流程.png";
				Deployment deployment=repositoryService.createDeployment()
																			.addClasspathResource(filename)
																			.addClasspathResource(pngname)
																			.disableBpmnValidation()
																			.name("请假申请表")
																			.deploy();
				System.out.println(deployment.getName());
		}
		/**
		 * 功能描述: 通过zip部署流程,zip压缩包中包含【请假申请流程.bpmn】和【请假申请流程.png】文件
		 * @return : void
		 */
		@Test
		public void initDeploymentZIP() {
				InputStream fileInputStream = this.getClass()
																							.getClassLoader()
																							.getResourceAsStream("diagram/请假申请流程.zip");
				ZipInputStream zip=new ZipInputStream(fileInputStream);
				Deployment deployment=repositoryService.createDeployment()
																			.addZipInputStream(zip)
																			.name("请假申请表zip")
																			.deploy();
				System.out.println(deployment.getName());
		}
		/**
		 * 功能描述: 查询流程部署
		 * @return : void
		 */
		@Test
		public void getDeployments() {
				List<Deployment> list = repositoryService.createDeploymentQuery().list();
				for(Deployment dep : list){
						System.out.println("Id："+dep.getId());
						System.out.println("Name："+dep.getName());
						System.out.println("DeploymentTime："+dep.getDeploymentTime());
						System.out.println("Key："+dep.getKey());
				}

		}
		/**
		 * 功能描述: 删除流程部署
		 * @return : void
		 */
		@Test
		public void delDeployments() {
				//流程部署的ID，可以通过上面的【getDeployments()】方法查看
				repositoryService.deleteDeployment("7ab93607-ac1d-11ec-9c16-005056c00008");
				System.out.println("删除流程部署成功");
		}
		/**
		 * 功能描述: 查询流程定义
		 * @return : void
		 */
		@Test
		public void getDefinitions(){
				List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
				for(ProcessDefinition pd : list){
						System.out.println("------流程定义--------");
						System.out.println("Name："+pd.getName());
						System.out.println("Key："+pd.getKey());
						System.out.println("ResourceName："+pd.getResourceName());
						System.out.println("DeploymentId："+pd.getDeploymentId());
						System.out.println("Version："+pd.getVersion());
				}
		}
}
